package ch.webkito.module;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServlet;

import ch.webkito.servlet.InitParam;
import ch.webkito.servlet.ServletConfiguration;

import com.google.inject.servlet.ServletModule;

public abstract class WebkitoAutowireServletModule extends ServletModule {

	// TODO: find Annotations and autowire
	private String[] removeFirst(String[] arr) {
		List<String> tmp = new LinkedList<String>();
		for(int i = 1; i < arr.length; i++) {
			tmp.add(arr[i]);
		}
		return tmp.toArray(new String[tmp.size()]);
	}

	protected void autowire(Class<? extends HttpServlet> servlet ) {
		if(servlet.isAnnotationPresent(ServletConfiguration.class)) {
			ServletConfiguration config = servlet.getAnnotation(ServletConfiguration.class);
			// prepare init parameters
			Map<String, String> initParams = new HashMap<String, String>();
			for(InitParam initParm : config.initParams()) {
				initParams.put(initParm.name(), initParm.value());
			}
			
			// map urls
			if(config.urlMappings().length > 0) {
				if(config.urlMappings().length == 1) {
					serve(config.urlMappings()[0]).with(servlet, initParams);
				} else {
					serve(config.urlMappings()[0], removeFirst(config.urlMappings())).with(servlet, initParams);
				}
			}
			
			// map regex urls
			if(config.urlMappingsRegex().length > 0) {
				if(config.urlMappings().length == 1) {
					serveRegex(config.urlMappingsRegex()[0]).with(servlet, initParams);
				} else {
					serveRegex(config.urlMappingsRegex()[0], removeFirst(config.urlMappingsRegex())).with(servlet, initParams);
				}
			}
		}
	}

	protected void autowire(Class<? extends HttpServlet> servlet, Class<? extends HttpServlet> ... servlets) {
		autowire(servlet);
		for(Class<? extends HttpServlet> s : servlets) {
			autowire(s);
		}
	}

	
}